package com.company.zhishidian;

/**
 * 定义在另一个类里面的类
 */
public class NeiBuClass {
    // 成员变量
    private int i = 10;

    public NeiBuClass(int i) {
        this.i = i;
    }

    // 成员方法
    public void outerMethod() {
        System.out.println("外部类的方法");
    }

    // 静态成员
    private static int n = 200;

    // 内部列 是外部类 NeiBuClass 的一个成员  （成员内部类）
    public class Inner {
        // 内部类不能有静态成员
//        private static int j =20;
//        public static void method() {}
        private int j = 20;

        // 内部类可以直接访问外部成员
        public void interMethod() {
            System.out.println("i=" + i);
            outerMethod();
        }

    }

    // 静态内部列 是嵌套在外部类 NeiBuClass 的一个静态成员  （静态成员内部类）
    public static class Inner2 {
        // 静态内部类中可以有静态成员
        private static int t =20;
        private int j = 20;

        // 内部类可以直接访问外部成员
        // 不能直接访问外部非静态成员
        public void interMethod() {

        }

    }

    // 局部内部类 在方法或块中的类
    public void method(){
        // 局部变量都是final 修饰的，所以变量不可变
        int t = n;
        // 如需改变，可设为数组
        int[] tt = {n};
        // 局部内部类
        class Inner{
            private int k = 10;
            // 外部的所有成员（外部静态、非静态，本地的成员）都可以访问
            public void method(){
                System.out.println(i);
                System.out.println(t);
//                System.out.println(t++);   // final修饰所以不能改变其值
                System.out.println(tt[0]--);
                System.out.println(n);
            }
        }
        new Inner().method();
    }

    // 匿名内部类  没有实际的名字
    public void method2(){
        // 匿名内部类  new 了一个接口的子类
        // 接口不可以被new
        new MyInter(){
            @Override
            public void method(){
                System.out.println("new 了一个接口的子类，然后调用该接口的方法，方法会在匿名内部类中实现");
                System.out.println("111");
            }
        }.method();
    }


    public static void main(String[] args) {
        // 成员内部类实例
        NeiBuClass.Inner inner = new NeiBuClass(2).new Inner();
        inner.interMethod();
        // 静态成员内部类实例
        NeiBuClass.Inner2 inner2 = new NeiBuClass.Inner2();

    }
    /**
     * 内部类应用
     * 互相依赖的关系 和 东西是在你内部的
     */
}


interface MyInter{
   public void method();
}



